package com.dragon.common.spring.enhancers.helpers;

import com.dragon.common.spring.annotations.ValuePack;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Method;

/**
 * @author Chris Chan
 * Create On 2025/8/1 上午9:21
 * Use for: 检查是否支持包裹ValueResult
 * Explain: 用于HttpResultCommonWrapAdvice判断 附加功能
 * 有些接口的返回数据可能是主要数据类型，需要包括一层ValueResult，便于返回json
 */
public class ValueResultWrapHelper {
    /**
     * 解析是否支持包裹HttpResult
     *
     * @param returnType
     * @param converterType
     * @return
     */
    public static boolean support(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        // 前置检查：只有带有@RestController注解的类才处理
        Class<?> containingClass = returnType.getContainingClass();
        if (null == AnnotationUtils.findAnnotation(containingClass, RestController.class)) {
            return false; // 不是RestController，直接返回false
        }
        // 1. 首先检查方法上的注解（最高优先级）
        Method method = returnType.getMethod();
        if (method != null) {
            ValuePack methodAnnotation = AnnotationUtils.findAnnotation(method, ValuePack.class);
            if (methodAnnotation != null) {
                return methodAnnotation.required();
            }
        }

        // 2. 检查实现类上的注解（第二优先级）
        ValuePack classAnnotation = AnnotationUtils.findAnnotation(containingClass, ValuePack.class);
        if (classAnnotation != null) {
            return classAnnotation.required();
        }

        // 3. 如果方法来自接口，检查接口方法上的注解（第三优先级）
        if (method != null) {
            Class<?>[] interfaces = containingClass.getInterfaces();
            for (Class<?> interfaceClass : interfaces) {
                try {
                    Method interfaceMethod = interfaceClass.getMethod(method.getName(), method.getParameterTypes());
                    ValuePack interfaceMethodAnnotation = AnnotationUtils.findAnnotation(interfaceMethod, ValuePack.class);
                    if (interfaceMethodAnnotation != null) {
                        return interfaceMethodAnnotation.required();
                    }
                } catch (NoSuchMethodException e) {
                    // 接口中没有对应方法，忽略
                }
            }
        }

        // 4. 最后检查接口类上的注解（最低优先级）
        if (method != null) {
            Class<?>[] interfaces = containingClass.getInterfaces();
            for (Class<?> interfaceClass : interfaces) {
                ValuePack interfaceClassAnnotation = AnnotationUtils.findAnnotation(interfaceClass, ValuePack.class);
                if (interfaceClassAnnotation != null) {
                    return interfaceClassAnnotation.required();
                }
            }
        }

        // 如果没有任何地方找到注解，则返回false表示不需要包装
        return false;
    }
}
